package com.exonline.front.controller.teacher;

import com.exonline.commons.base.IBaseService;
import com.exonline.commons.dao.DaoImpl;
import com.exonline.commons.dao.IDao;
import com.exonline.commons.entity.Courses;
import com.exonline.commons.entity.Teacher;
import com.exonline.commons.utils.TokenUtils;
import com.exonline.commons.entity.HonorPicture;
import com.exonline.commons.entity.TInfo;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import javax.servlet.http.HttpServletRequest;
import java.sql.SQLException;
import java.util.List;

/**
 * @desc 教师模块的M层
 * @author  hbrj
 */
public class TeacherService implements IBaseService<Teacher> {

    // 创建一个IDao对象，用于执行数据库操作
    IDao<Teacher> teacherIDao = new DaoImpl<>();  //教师
    IDao<Courses> coursesIDao = new DaoImpl<>();  // 课程
    IDao<HonorPicture> honorPictureDao = new DaoImpl<>(); // 荣誉图片
    IDao dao = new DaoImpl();

    /**
     * @desc 1. 实现IBaseService接口中的queryAll方法，用于分页查询所有教师信息
     * @author hbrj
     * @throws SQLException
     */
    @Override
    public List<Teacher> queryAll(int pageSize, int pageNo) throws SQLException {
        // 执行分页查询，传入SQL语句、参数列表、当前页码和
        return teacherIDao.queryWithPagingAndConditions("SELECT * from teacher",null,pageNo,pageSize,new BeanListHandler<>(Teacher.class));
    }

    /**
     * @desc  2.根据教师ID查询单个教师信息
     * @author hbrj
     * @throws SQLException
     */
    @Override
    public Teacher queryOne(String id) throws SQLException {
        // 执行查询操作，传入SQL语句和参数列表，将查询结果封装为Teacher对象并返回
        return   teacherIDao.queryForObject("select * from teacher where id = ?", new BeanHandler<>(Teacher.class), id);
    }

    /**
     * @desc 3. 用于添加一个新的教师记录
     * @author hbrj
     * @throws SQLException
     */
    @Override
    public void add(Object... paras) throws SQLException {
        // 修改插入教师表的SQL语句，添加status字段，确保字段顺序与传入参数顺序一致
        String sql = "INSERT INTO teacher (id, tname, workyears, direction, introduce, email, phone, password, status) VALUES(?,?,?,?,?,?,?,?,?)";
        teacherIDao.updateWithTransaction(sql, paras);
    }
    /**
     * 3.1 保存荣誉图片信息到honorpicture表中
     * @param id    图片的唯一id
     * @param tid    关联的教师id
     * @param pictureUrl   图片的路径或链接
     * @throws SQLException 数据库操作异常
     */
    public void saveHonorPicture(String id, String tid, String pictureUrl) throws SQLException {
        String sql = "INSERT INTO honorpicture (id, tid, pictureurl) VALUES(?,?,?)";
        honorPictureDao.updateWithTransaction(sql, id, tid, pictureUrl);
    }


    /**
     * @desc  4. 用于更新教师记录
     * @author hbrj
     */
    @Override
    public void update(Object... paras) throws SQLException {
      teacherIDao.updateWithTransaction("UPDATE teacher SET tname=?,workyears=?,direction=?,email=?,phone=?,password=?,WHERE id = ?",paras);
    }

    /**
     * @desc  5. 根据教师ID删除教师记录
     * @author hbrj
     */
    @Override
    public void deleteById(String id) throws SQLException {
      teacherIDao.updateWithTransaction(" DELETE FROM teacher WHERE id = ?",id);
    }


    /**
     * @desc  6. 教师的系统的  数据统计 (销售量  总收入  课程访问量)
     * @author hbrj
     */
    public TInfo getInfo(HttpServletRequest req) throws SQLException {
        // 创建TInfo对象，用于存储统计信息
        TInfo tInfo = new TInfo();
        // 从请求对象中获取教师ID
        String tid = TokenUtils.getId(req);
        /**
         * @desc  6.1销售量的查询
         */
        List<Object[]> totalSales = dao.queryWithPagingAndConditions("SELECT total_sales FROM tsalesview WHERE id = ? ", null, 1, 10, new ArrayListHandler(), tid);
        // 遍历查询结果，将第一个元素转换为字符串并赋值给tInfo对象的totalSales属性
        for (Object[] totalSale : totalSales) {
            // 将totalSale转成int
            String value = totalSale[0].toString();
            // 将查询结果赋值给tInfo对象的totalSales属性
            tInfo.setTotalSales(value);
            System.out.println(tInfo);
        }
        /**
         * @desc  6.2总收入的查询
         */
        List<Object[]> totalProfits = dao.queryWithPagingAndConditions("SELECT totalprofit FROM teachertestnew WHERE tid = ?", null, 1, 10, new ArrayListHandler(), tid);
        // 遍历查询结果，将第一个元素转换为字符串并赋值给tInfo对象的totalSales属性
        for (Object[] totalprofit : totalProfits) {
            // 将totalSale转成int
            String value = totalprofit[0].toString();
            // 将查询结果赋值给tInfo对象的totalSales属性
            tInfo.setTotalProfits(value);
            System.out.println(tInfo);
        }
        /**
         * @desc 6.3课程访问量
         */
        List<Object[]> totalViews = dao.queryWithPagingAndConditions("SELECT total_views FROM cinterview WHERE id = ?", null, 1, 1, new ArrayListHandler(), tid);
        // 遍历查询结果，将第一个元素转换为字符串并赋值给tInfo对象的totalSales属性
        for (Object[] totalView : totalViews) {
            // 将totalSale转成int
            String value = totalView[0].toString();
            // 将查询结果赋值给tInfo对象的totalSales属性
            tInfo.setTotalViews(value);
            System.out.println(tInfo);
        }
        return tInfo;
    }

    /**
     * @desc  7.教师端课程 模糊查询
     * @author hbrj
     */
    public List<Courses> searchCourses(String courseName, String tid) {
        try {
            // 7.1构建模糊查询的SQL语句，使用LIKE关键字结合传入的课程名参数进行模糊匹配，同时添加tid的筛选条件
            String sql = "SELECT * FROM courses WHERE cname LIKE? AND tid =?";
            // 7.2使用coursesIDao执行查询操作，传入课程名参数（已添加通配符）和教师编号参数，并将结果封装为Courses对象列表返回
            return coursesIDao.queryWithPagingAndConditions(sql, null, 1, 10000, new BeanListHandler<>(Courses.class), "%" + courseName + "%", tid);
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }
}
